package handler;

import dao.UsuarioDao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.RollbackException;
import pojo.Usuario;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

/**
 *
 * @author Vanessinha
 */
@Named(value = "usuarioHandler")
@SessionScoped
public class UsuarioHandler implements Serializable {

    @EJB
    private UsuarioDao usuariodao = new UsuarioDao();
    private Usuario usuario = new Usuario();
    private List<Usuario> listaUsuario = new ArrayList<>();
    private Usuario excluido;
    private long idAutorizacao;
    private long idUsuario;

    public UsuarioHandler() {
        
//        usuario = new Usuario();
//        SecurityContext context = SecurityContextHolder.getContext();
//        if (context instanceof SecurityContext) {
//            Authentication authentication = context.getAuthentication();
//            if (authentication instanceof Authentication) {
//                usuario.setUsuario(((User) authentication.getPrincipal()).getUsername());
//            }
//        }
    }

    public long getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public long getIdAutorizacao() {
        return idAutorizacao;
    }

    public void setIdAutorizacao(long idAutorizacao) {
        this.idAutorizacao = idAutorizacao;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getListaUsuario() {
        return listaUsuario;
    }

    public void setListaUsuario(List<Usuario> listaUsuario) {
        this.listaUsuario = listaUsuario;
    }

    public String salvar() {
        if (!usuario.getPassword().equals(usuario.getConfirmaPassword())) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "ATENÇÃO", "Senhas não conferem."));
        } else {
            usuariodao.inserir(usuario);
            usuario = new Usuario();
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "CONFIRMAÇÃO",
                    "Cadastrado realizado com sucesso!"));
        }
        return "CadastroUsuario.xhtml";
    }

    public String removerusuario(Usuario obj) {
        try {
            usuariodao.excluir(obj);
            cancelar();
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "CONFIRMAÇÃO", "Registro removido com sucesso!"));
        } catch (RollbackException e) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "ATENÇÃO", "Registro já esta em uso, não pode ser removido."));
        }
        return "CadastroUsuario.xhtml";
    }

    public void parametroRemover(ActionEvent event) {
        UIComponent link = event.getComponent();
        UIParameter param = (UIParameter) link.findComponent("idParaRemover");
        excluido = (Usuario) param.getValue();
    }

    public void remover() {
        removerusuario(excluido);
        excluido = null;
    }

    public void alterar(Usuario obj) {
        obj = usuariodao.pesquisar(obj.getIdUsuario());
        this.usuario = obj;
    }

    public List<Usuario> listausuario() {
        return listaUsuario = usuariodao.getAll();
    }

    public String cancelar() {
        usuario = new Usuario();
        return "CadastroUsuario.xhtml";
    }

    public String validaLogin() {
        boolean loginValido = usuariodao.existe(usuario);
        if (loginValido) {
            return "Index.xhtml?faces-redirect=true";
        } else {
            usuario = new Usuario();
            return "LoginInvalido.xhtml";
        }
    }
}
